/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Hndlr;

import DataTypes.DataEvento;
import DataTypes.DataMensaje;
import DataTypes.DataUsuario;
import Interfaces.Factory;
import enums.enumRol;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import objetos.Amistad;
import objetos.Even;
import objetos.Grupo;
import objetos.Historial;
import objetos.Mensaje;
import objetos.Usuario;

/**
 *
 * @author jota
 */
public class HndlrUsuario {
    
    private HashMap<String,Usuario> ListUsuarios;
    
    private HndlrUsuario() {
        ListUsuarios = new HashMap<String,Usuario>();
    }
    
    public static HndlrUsuario getInstance() {
        return HndlrUsuarioHolder.INSTANCE;
    }
    
    public HashMap<String, DataEvento> listarCalendarioEventos(String nom) {

        Usuario usu = ListUsuarios.get(nom);
        DataEvento dg;
        HashMap<String,DataEvento> listDg = new HashMap<String,DataEvento>();
        Iterator<Even> itera  = usu.getCalendarioEventos().values().iterator();
        
        while (itera.hasNext()){
            Even e = itera.next();
            dg = new DataEvento(e.getNombre(), e.getTipoEvento(),e.isRepetible(),e.getFecha(),e.getDiasDeSemana(),e.getAutor());
            listDg.put(dg.getNombre(),dg);
        }
        
        return listDg;
    }

    public boolean yaExisteNick(String nick) {
        
        Iterator<Usuario> itera = ListUsuarios.values().iterator();
        boolean yaExisteNick = false;
        while (itera.hasNext() && !yaExisteNick){
            if (itera.next().getNick().equals(nick)){
                yaExisteNick = true;
            }
        }
        
        return yaExisteNick;
        
    }

    public Usuario getUsuarioU(String clave) {
        return ListUsuarios.get(clave);
    }

    public ArrayList<Usuario> listarAmigos(String correoUsr) {
        Usuario usu = ListUsuarios.get(correoUsr);
        return usu.listarAmigos();
    }


    private static class HndlrUsuarioHolder {
        private static final HndlrUsuario INSTANCE = new HndlrUsuario();
    }
    
    public void AltaUsuario (DataUsuario du) throws IOException{
       Usuario usu = new Usuario(du);
       boolean esta =  ListUsuarios.containsKey(usu.getCorreo());
       if(!esta)       
           ListUsuarios.put(usu.getCorreo(),usu);
    }
    
    public void BloqueoUsuario(DataUsuario du){
        Usuario usu = ListUsuarios.get(du.getCorreo());
        usu.setBloqueo(true);
        HndlrGrupo hGrupo = HndlrGrupo.getInstance();
        boolean es = false;
        Iterator<Grupo> itera = usu.getGrupos().iterator();
        Grupo gr = null;
        while (itera.hasNext()){
            gr = itera.next();
            es = gr.obtenerRol(du.getCorreo()).getRolUsr().toString().equals(enumRol.CREADOR.toString());
            if (es) {
                hGrupo.eliminarGrupo(gr.getNombre());
            }
        }
    }
       
    public HashMap listaUsuarios(){
        return ListUsuarios;
    }
    
    public ArrayList<DataUsuario> listarDUsuarios(){
        DataUsuario du;
        ArrayList<DataUsuario> listDu = new ArrayList<DataUsuario>();
        Iterator <Usuario> it = ListUsuarios.values().iterator();
        Usuario usu;
        while(it.hasNext())
        {
            usu = it.next();
            du = new DataUsuario(usu.getCorreo(),usu.getNombre(), usu.getNick(), usu.getContrasena(),usu.getFechaNac(), usu.getSexo(), usu.getCiudad(), usu.getPais(), usu.getBloqueo(), usu.getNivelVisibilidad(), usu.getImagen(),usu.getDataEventos(),usu.getDataAmigos(),usu.getMuro().getDataMuro(),usu.isNotificar(),usu.isCambioPass());
            du.setHistorial(usu.getDHistoriales());
            listDu.add(du);
        }
        return listDu;
    }
    
    public boolean containsKey (String clave)
    {
        return ListUsuarios.containsKey(clave);
    }
    public DataUsuario getUsuario(String clave) {
        Usuario usu = ListUsuarios.get(clave);
       DataUsuario dat = new DataUsuario(usu.getCorreo(),usu.getNombre(), usu.getNick(), usu.getContrasena(),usu.getFechaNac(), usu.getSexo(), usu.getCiudad(), usu.getPais(), usu.getBloqueo(), usu.getNivelVisibilidad(), usu.getImagen(),usu.getDataEventos(),usu.getDataAmigos(),usu.getMuro().getDataMuro(),usu.isNotificar(),usu.isCambioPass());
       return dat;
    }
    
    public void quitarUsuario(String clave) {
        ListUsuarios.remove(clave);
    }
    
    /*public void ModificarUsuario(DataUsuario du ,String clave){
       Usuario us = ListUsuarios.get(clave);
       if(!du.getCorreo().equals(clave))
       {
        ListUsuarios.remove(clave);
        us.setCorreo(du.getCorreo());
        ListUsuarios.put(du.getCorreo(), us);
           
       }
       us.setCiudad(du.getCiudad());
       us.setContrasena(du.getContrasena());
       us.setFechaNac(du.getFechaNac());
       us.setNick(du.getNick());
       us.setNivelVisibilidad(du.getNivelVisibilidad());
       us.setNombre(du.getNombre());
       us.setSexo(du.getSexo());
       us.setPais(du.getPais());
       us.setCambioPass(du.isCambioPass());
         
    }*/
    
    public void AgregarAmigo (String claveUsu,String amigo) throws IOException
    {
        Usuario usu = ListUsuarios.get(claveUsu);
        Usuario am = ListUsuarios.get(amigo);
        Calendar cal = Calendar.getInstance();
        Amistad amigos = new Amistad(usu, am,Factory.getInstance().getRelojSistema().getTime());
        usu.agregarAmistad(amigos);
        am.agregarAmistad(amigos);
        
      
    }
    
   public ArrayList<DataUsuario> listarDAmigos(String ClaveUsu){
       
       Usuario usu = ListUsuarios.get(ClaveUsu);
       return usu.listarDAmigos();
       
   }
   
    public void quitarAmigo(String claveUsu, String amigo) {
        
        Usuario usu = ListUsuarios.get(claveUsu);
        Usuario am = ListUsuarios.get(amigo);
        usu.quitarAmigo(amigo);
        am.quitarAmigo(claveUsu);
        
    }
    
    public Usuario obtenerUsuario(String mail){
        return ListUsuarios.get(mail);
    }
    
    public void listarUsuario(String nick){
    }
    
    public boolean esCreadorGrupo (String correo){ 
        //Iterator<DataGrupo> iteraGrupos = HndlrGrupo.getInstance().listarGrupos().iterator();
        //while (!es && iteraGrupos.hasNext()){
            //es = iteraGrupos.next().getCreador().equals(correo);
        //}
        Usuario us = ListUsuarios.get(correo);
        return us.esCreadorGrupo(correo);
    }
    
    public void agregarEvento (DataEvento even, String clave){
        
        Usuario usu = ListUsuarios.get(clave);
        usu.agregarEvento(even);
        
    }
    
    public void activarNotificaciones(String mailUsr, boolean activar){
        Usuario usr = ListUsuarios.get(mailUsr);
        usr.activarNotificaciones(activar);
    }
    
    public void clear(){
        
        ListUsuarios.clear();
        
    }
    
    public void agregarHistorial(String idUsuario,String idAmigo,ArrayList<DataMensaje>list){
        
        Iterator <DataMensaje> it = list.iterator();
        ArrayList <Mensaje>resu = new ArrayList<Mensaje>();
        
        while(it.hasNext()){
            
            DataMensaje dmen = it.next();
            Mensaje men = new Mensaje(dmen);
            resu.add(men);
            
        }
        Usuario usu = ListUsuarios.get(idUsuario);
        usu.agergarHistorial(idAmigo, resu);
        
    }
    
     
}
